import mysql from "mysql";
import type { PoolConfig, Connection } from "mysql";
import { ExecuteSql } from "./typing";
import { logger } from "@/utils/log"; // 日志方法
// 数据库连接配置
const config: PoolConfig = {
  host: "127.0.0.1", // 连接主机
  user: "root", // 数据库用户的用户名
  password: "123456", // 数据库用户的密码
  database: "database", // 数据库名称
};

// 连接实例方式
let connection: Connection;
const handleConnect = () => {
  // 创建连接实例
  connection = mysql.createConnection(config);

  // 使用实例connect方法建立连接
  connection.connect((error) => {
    if (error) {
      logger.error({ message: "mysql连接失败！", error });
      // 失败后，2秒重试
      setTimeout(handleConnect, 2000);
    } else {
      logger.log("mysql连接成功！");
    }
  });

  // 监听错误信息
  connection.on("error", (error) => {
    // 如果是连接断开，自动重新连接
    if (error.code === "PROTOCOL_CONNECTION_LOST") {
      handleConnect();
    } else {
      logger.error({ message: "数据库连接错误", error });
    }
  });

  // 关闭连接
  // connection.end((error) => {
  //   if (error) {
  //     logger.error({message: "mysql连接关闭失败！", error});
  //   } else {
  //     logger.log("mysql连接关闭成功！");
  //   }
  // });
};
handleConnect();

// 连接实例执行sql方法
/* sql和参数分离，防止sql注入 */
export const execute: ExecuteSql = (sql, params) => {
  return new Promise((resolve, reject) => {
    connection.query(sql, params, (error, data) => {
      if (error) {
        reject({ message: "sql执行失败", error });
      } else {
        resolve(data);
        logger.log("sql执行成功");
      }
    });
  });
};

// 连接池实例方式，创建连接池实例
// const pool = mysql.createPool(config);

// 连接池方法执行sql
// export const execute: ExecuteSql = async (sql, params) => {
//   return new Promise((resolve, reject) => {
//     // 从连接池中取出连接，如无连接可用则隐式的建立一个数据库连接。
//     pool.getConnection((error, connection) => {
//       if (error) {
//         logger.error({message: "mysql连接失败！", error});
//       } else {
//         connection.query(sql, params, (error, data) => {
//           if (error) {
//             reject({ message: "sql执行失败", error });
//           } else {
//             resolve(data);
//           }
//           // 归还到连接池
//           connection.release();
//         });
//       }
//     });
//   });
// };
